// crc_mlan    CRC uLAN
//   8  9   (CRC7  CRC8)
//      CRC,
//   
//(      )
//      
// task_flags
//
// task_flags = 0 -   
//       false
//  CRC    true
//
// task_flags = 1 -   CRC  
//     
//   CRC
//
//     
//    (byte data[9])
//
//   
#define test_crc 0 // ,     true
#define gen_crc 1 //     
               //  ,    
#define crc_7 7 //   CRC7 ( )
#define crc_8 8 //   CRC8 ( )
//
// 
byte crc_mlam(byte*, byte, byte)
// pad -   
// mod - crc_7  crc_8
// task - test_crc  gen_crc
//
// 
byte crc_mlan(byte *pad, byte mod, byte task)
 {
   byte tmp_crc = 0; byte ret_data = 0;
 for (byte cnt=0; cnt<mod; cnt++)
   {
    byte tmp = *(pad + cnt);
    for (byte a=0; a<8; a++)
     {
       if ((tmp_crc ^ tmp) & 0x01) //     
        {
         tmp_crc = ((tmp_crc ^ 0x18) >> 1) | 0x80;
        } //     =1
       else
        {
         tmp_crc = (tmp_crc >> 1) & 0x7F;
        } //     =0
       tmp = tmp >> 1; //   
     }
   }
  if (task)
   {
    ret_data = tmp_crc; //     
    *(pad + mod) = tmp_crc; //     
   }
  else
    {
     ret_data = (tmp_crc == *(pad + mod)) ? 0 : 1 ;
    }
  return ret_data;
 }

//-----------------------------------------------------------------------
//  ,   CRC8:

crc_mlan(data, crc_8, test_crc);

//   0   CRC
//  1   CRC
